using System;
using System.Data;
using Gtk;

namespace Serpis
{
	/// <summary>
	/// Rellena el TreeView con los valores que les pasemos
	/// </summary>
	public class TreeViewHelper
	{
		//**	Declaramos el evento 'Changed' como publico	
		public event EventHandler Changed;
		
		private ListStore listStore;
		public TreeView treeView;
		private IDbCommand dbCommand;
		private string commandText;
		


		public TreeViewHelper(TreeView TView, IDbConnection connection, string commandText)
		{
			this.treeView = TView;
//			****Suscribimos al evento 'Changed' el treeView.Selection.Changed para detectarlo
			/*treeView.Selection.Changed += delegate
			{
				raisedChanged();
			};*/
			this.commandText = commandText;
			this.dbCommand = connection.CreateCommand();
			dbCommand.CommandText = commandText;
			
			Refresh();
		}
		// Función que ejecuta una consulta devolviendo el último valor del Id
		public int NextId()
		{
			dbCommand.CommandText = "select MAX(id) from articulo";
			int lastId = Convert.ToInt32(dbCommand.ExecuteScalar());
			dbCommand.CommandText = commandText;
			return(lastId+1);		
				
		}
//		**** ACTUALIZA el contenido del TreeView
		public void Refresh()		
		{
			Console.WriteLine("Actualizamos TreeView");
			
			IDataReader dataReader = dbCommand.ExecuteReader();
//			**** Con el siguiente if conseguiremos contador crear las columnas necesarias para el TreeView
			if(treeView.Columns.Length == 0)
			{
				for(int i=0; i<dataReader.FieldCount; i++)
				{
					treeView.AppendColumn(dataReader.GetName(i), new CellRendererText(), "text", i);
				}			
			}			
			if(listStore == null)
			{
				/*
				treeView.Selection.Changed += delegate
				{
					raisedChanged();
				};*/
//				**** Creamos el array de tipos 'types' con la clase estática TypeExtensions
				Type[] types = TypeExtensions.GetTypes<string>(dataReader.FieldCount);
				listStore = new ListStore(types);		
			}
			else
			{
				listStore.Clear();
			}
			while(dataReader.Read())
			{
				listStore.AppendValues(dataReader.GetValues());
			}
			treeView.Model = listStore;
			
			dataReader.Close();			
			
			treeView.Selection.Changed += delegate
			{
				raisedChanged();
			};
		}
//		**** DEVUELVE el valor del numero de campo de la fila seleccionada en el TreeView
		public string GetValue(int columnIndex)
		{
			TreeIter treeIter;
			treeView.Selection.GetSelected(out treeIter);
			return (string)listStore.GetValue(treeIter, columnIndex);
		}
//		**** INDICA si hay registro seleccionado en el treeView
		public bool HasSelected 
		{
			get {return treeView.Selection.CountSelectedRows() > 0;}
		}
//		**** INDICA si NO HAY un registro seleccionado en el treeView
		public bool NoHasSelected
		{
			get {return treeView.Selection.CountSelectedRows() == 0;}
		}
		private void raisedChanged()
		{
			if(Changed != null)
			{
				Changed(this, EventArgs.Empty);
				Console.WriteLine("Elemento lanzado desde el TreeViewHelper.");
			}
		}
	}
}